//
// Created by Jisam on 30/09/2024 6:38 PM.
// Solution of  Robert Hood and Mrs Hood
// 2024-09-30 19:38:23 AC 100 差分 + 前缀和还原
//#pragma GCC optimize(3)
#include <bits/stdc++.h>

#define int long long
using namespace std;
#define endl "\n"
#define PII pair<int,int>
#define VVI vector<vector<int>>
#define VI vector<int>
#define code_by_jisam cin.tie(nullptr)->sync_with_stdio(false);
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1,};
int dy[] = {0, 0, -1, 1, 1, -1, -1, 1,};
const double pi = acos(-1);

// 解决方案函数，用于计算特定条件下的最大和最小值的位置
void solution() {
    // 定义变量n,d,k分别存储数组长度、滑动窗口大小和查询次数
    int n, d, k;
    cin >> n >> d >> k;

    // 定义一个大小为n-d+2的整数向量pre，用于存储前缀和差分数组
    vector <int> pre(n - d + 2);

    // 通过循环k次，每次读取两个整数l和r，并对它们进行调整和操作
    for (int i = 0, l, r; i < k; ++i) {
        cin >> l >> r, --l;

        // 将l调整为不超过0且不小于l-d+1的值
        l = max(l - d + 1, 0ll);

        // 将r调整为不超过n-d+1的值
        r = min(r, n - d + 1);

        // 对前缀和差分数组进行操作，记录区间的开始和结束位置
        pre[l]++, pre[r]--;
    }

    // 通过循环计算前缀和，以便后续可以快速查询区间和
    for (int i = 1; i <= n - d + 1; ++i) {
        pre[i] += pre[i - 1];
    }

    // 找到前缀和数组中的最大值和最小值的位置，并输出结果
    cout << max_element(pre.begin(),pre.end() - 1) - pre.begin() + 1 << ' ' << min_element(pre.begin(),pre.end() - 1) - pre.begin() + 1 << '\n';
}


signed main() {
    code_by_jisam;
    int T = 1;
    cin >> T;
    while (T--) {
        solution();
    }
    return 0;
}